package com.zhuzhiguang;

import java.util.Calendar;
import java.util.Date;

public class DateUtil {
	
	final static long MILLIONSPERMINUTE = 1000*60;// 一分钟有多少毫秒
	
	  
	
	/**
	* 功能：根据生日计算年龄
	* 示例：现在是2020-4-23，如果生日是2020-5-20，那结果是19
	* 
	* @param Date，生日
	* @return int 年龄
	*/
	public static int getAge(Date birthday){
		
		if(birthday==null)
			return 0;
		
		//TODO 实现代码
		//得到今天的日期
		Date today = new Date();
		
		// 出生的年月日
		int bYear = birthday.getYear();
		int bMonth = birthday.getMonth();
		int bDay = birthday.getDate();
		
		// 今天的年月日
		int tYear = today.getYear();
		int tMonth = today.getMonth();
		int tDay = today.getDate();
		
		int age=tYear-bYear;
		//如果今天的月份小  
		if(tMonth<bMonth) {
			age--;
		}else if(tMonth==bMonth) {
			// 月份相同但是日期小 年龄减1
			if(tDay < bDay)
				age--;
		}
		return age;
		
	}
	
	/**
	* 功能：给定时间对象，获取该时间的月初1日0时0分0秒0毫秒
	* 示例：2018-11-11 08:30:16 → 2018-11-01 00:00:00
	* 使用场景：可用在数据库里查询某月的时间范围
	*
	* @param Date 源时间
	* @return Date 月初时间
	*/
	public static Date getFirstDayOfMonth(Date src){
		
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(src);
		
		calendar.set(Calendar.MILLISECOND, 0);
		//时分秒都设置成0  天设置成1
		calendar.set(Calendar.SECOND, 0);
		calendar.set(Calendar.AM_PM, Calendar.AM); //上午
		calendar.set(Calendar.MINUTE, 0); //分钟
		calendar.set(Calendar.HOUR, 0); //小时
		calendar.set(Calendar.DATE, 1); // 天
		
		return calendar.getTime();
		
		//TODO 实现代码
	}
	
	/**
	* 功能：获取人性化时间，例如5分钟之内则显示“刚刚”，其它显示16分钟前、2小时前、3天前、4月前、5年前等
	*
	* @param Date date 源时间。
	* @return 人性化时间
	*/
	public static String getDisplayTime(Date date){
		//TODO 实现代码
		long current = new Date().getTime();
		long pre =  date.getTime();
		long  minutes = (current - pre)/MILLIONSPERMINUTE;
		if(minutes<=5) {
			return "刚刚";
		}
		
		if(minutes<60) {
			return minutes+"分钟之前";
		}
		
		if(minutes/60 < 24) {
			return minutes/60+"小时之前";
		}
		
		int days= (int)minutes/60/24;
		if(days<30)
			return days + "天之前";
		
		if(days<365) {
			return days/30 + "月之前";
		}
		
		return days/365 + "年之前"; 
		
	}

	
	/**
	* 功能：给定时间对象，获取该时间的月末最后一天的23时23分59秒999毫秒
	* 示例：2018-11-11 08:30:16 → 2018-11-30 23:23:59
	* 使用场景：可用在数据库里查询某月的时间范围
	* 注意：要考虑月大月小闰月问题
	*
	* @param Date 源时间
	* @return Date 月末时间
	*/
	public static Date getLastDayOfMonth(Date src){
		
		//TODO 实现代码
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(src);
		
		calendar.add(Calendar.MONTH,  1 );// 月份加一
		calendar.set(Calendar.MILLISECOND, 0);
		//时分秒都设置成0  天设置成1
		calendar.set(Calendar.SECOND, 0);
		calendar.set(Calendar.AM_PM, Calendar.AM); //上午
		calendar.set(Calendar.MINUTE, 0); //分钟
		calendar.set(Calendar.HOUR, 0); //小时
		calendar.set(Calendar.DATE, 1); // 天
		//  以上代码已经得到下个月的月初了
		//////////////  下一个月月初减去一秒就是这个月的月末  ///////////////
		calendar.add(Calendar.SECOND, -1);
		
		return calendar.getTime();
		
		//TODO 实现代码
	}
	
	/**
	* 功能：获取当前日期指定天数之前或之后的日期，如果参数为负数，则往前回滚。
	* 示例1：当前是2018-08-08，参数days=5，结果是2018-08-13
	* 示例2：当前是2018-08-08，参数days=-4，结果是2018-08-04
	* 
	* @param int days 偏移的天数，如果为负数则往前回滚。
	* @return Date 新日期
	*/
	public static Date offsetDate(int days) {
		//TODO 实现代码
		//TODO 实现代码
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(new Date());
		calendar.add(Calendar.DATE, days);
		return calendar.getTime();
	}
	
	/**
	* 功能：获取当前季节，如春季、夏季、秋季、冬季。
	* 
	* @return Season 季节
	*/
	public static Season getCurrentSeason() {
		//TODO 实现代码
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(new Date());
		int month = calendar.get(Calendar.MONTH);
		if(month<3)
			return Season.Spring;
		
		if(month<6)
			return Season.Summer;
		
		if(month<9)
			return Season.Autumn;
		
		return Season.Winter;
		
		
	}



	
}
